package com.chenqi.tool.ext

import java.math.BigDecimal
import java.nio.CharBuffer
import kotlin.math.abs
import kotlin.math.floor
import kotlin.math.pow

/**
 * 作者: CQ
 * 日期: 2022-06-10
 * 说明:
 */
/**
 * 取绝对值
 */
fun Any.toAbs() : String {
    return when (this) {
        is Double -> {
            abs(this).toString()
        }
        is Long -> {
            abs(this).toString()
        }
        is Float -> {
            abs(this).toString()
        }
        is Int -> {
            abs(this).toString()
        }
        else -> {
            ""
        }
    }
}

fun Any?.toStringNotNull() : String {
    if (this == null) {
        return ""
    }
    return this.toString().toStringNotNull()
}


/**
 * 类型装换成标桩的json数据
 */
fun Any.toJson() : String {
    return GsonUtils.GsonToJson(this)
}

inline fun <reified T> Any.toJsonBean() : T {
    return GsonUtils.GsonToBean(this.toJson(), T::class.java)
}

inline fun <reified T> Any.toJsonBeanList() : MutableList<T> {
    return GsonUtils.GsonToList(this.toJson(), T::class.java)
}

// 获取默认15位的随机数字字符串
fun getRandomNonce(digit : Int = 15) : String {
    return (10.0.pow(digit - 1) + Math.random() * (10.0.pow(digit) - 10.0.pow(digit - 1))).toLong().toString()
}

// 获取默认4位的16进制字符串
fun getRandom16(digit : Int = 4) : String {
    val buffer1 = CharBuffer.wrap("123456789abcdef")
    val buffer2 = CharBuffer.wrap("0123456789abcdef")
    val sb = StringBuffer()
    for (i in 0 until digit) {
        if (i == 0) {
            sb.append(buffer1.random())
        } else {
            sb.append(buffer2.random())
        }

    }
    return sb.toString()
}

/**
 * 除法
 * divisor1：除数
 * divisor1：被除数
 * scale：保留小数的位数
 */
fun getResultDivision(divisor1 : Double, divisor2 : Double, scale : Int = 6) : Double {
    if (divisor1 == 0.0) return 0.0
    if (divisor2 == 0.0) return divisor1
    val b1 = BigDecimal(divisor1)
    val b2 = BigDecimal(divisor2)
    return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toDouble()
}

/**
 * 复制实体类
 */
inline fun <reified T> Any.copyBean() : T {
    return GsonUtils.GsonToBean(GsonUtils.GsonToJson(this), T::class.java)
}

/**
 * 复制list
 */
inline fun <reified T> List<T>.copyList() : List<T> {
    return GsonUtils.GsonToList(GsonUtils.GsonToJson(this), T::class.java)
}